﻿using RBAC_Application.Dto.Input;
using RBAC_Application.Dto.Output;
using RBAC_Application.Dto.批量分配;
using System.Runtime.CompilerServices;

namespace RBAC_Application.Service.RBAC
{
    public interface IRbacService
    {
        // 用户管理
        /// <summary>
        /// 根据用户ID获取用户信息
        /// </summary>
        /// <param name="id">用户ID</param>
        /// <returns>用户信息</returns>
        UserDto GetUserById(long id);
        /// <summary>
        /// 获取所有用户信息
        /// </summary>
        /// <returns>所有用户列表</returns>
        List<UserDto> GetAllUsers();
        /// <summary>
        /// 根据条件获取用户列表
        /// </summary>
        /// <param name="keyword">关键词</param>
        /// <param name="isActive">是否激活</param>
        /// <returns>符合条件的用户列表</returns>
        List<UserDto> GetUsersByCondition(string keyword, bool? isActive);
        /// <summary>
        /// 登录
        /// </summary>
        /// <param name="userName"></param>
        /// <param name="password"></param>
        /// <returns></returns>
        LoginOutput ValidateUserLogin(string userName, string password);
        /// <summary>
        /// 创建新用户
        /// </summary>
        /// <param name="input">用户输入信息</param>
        void CreateUser(CreateUserInput input);
        /// <summary>
        /// 更新用户信息
        /// </summary>
        /// <param name="input">用户输入信息</param>
        void UpdateUser(UpdateUserInput input);
        /// <summary>
        /// 删除用户
        /// </summary>
        /// <param name="id">用户ID</param>
        void DeleteUser(long id);
        /// <summary>
        /// 检查用户名是否已存在
        /// </summary>
        /// <param name="userName">用户名</param>
        /// <returns>如果存在返回true，否则返回false</returns>
        bool CheckUserNameExists(string userName);

        // 角色管理
        /// <summary>
        /// 根据角色ID获取角色信息
        /// </summary>
        /// <param name="id">角色ID</param>
        /// <returns>角色信息</returns>
        RoleDto GetRoleById(long id);
        /// <summary>
        /// 获取所有角色信息
        /// </summary>
        /// <returns>所有角色列表</returns>
        List<RoleDto> GetAllRoles();
        /// <summary>
        /// 根据条件获取角色列表
        /// </summary>
        /// <param name="keyword">关键词</param>
        /// <returns>符合条件的角色列表</returns>
        List<RoleDto> GetRolesByCondition(string keyword);
        /// <summary>
        /// 创建新角色
        /// </summary>
        /// <param name="input">角色输入信息</param>
        void CreateRole(CreateRoleInput input);
        /// <summary>
        /// 更新角色信息
        /// </summary>
        /// <param name="input">角色输入信息</param>
        void UpdateRole(UpdateRoleInput input);
        /// <summary>
        /// 删除角色
        /// </summary>
        /// <param name="id">角色ID</param>
        void DeleteRole(long id);
        /// <summary>
        /// 检查角色名是否已存在
        /// </summary>
        /// <param name="roleName">角色名</param>
        /// <returns>如果存在返回true，否则返回false</returns>
        bool CheckRoleNameExists(string roleName);

        // 权限管理
        /// <summary>
        /// 根据权限ID获取权限信息
        /// </summary>
        /// <param name="id">权限ID</param>
        /// <returns>权限信息</returns>
        PermissionDto GetPermissionById(long id);
        /// <summary>
        /// 获取所有权限信息
        /// </summary>
        /// <returns>所有权限列表</returns>
        List<PermissionDto> GetAllPermissions();
        /// <summary>
        /// 根据条件获取权限列表
        /// </summary>
        /// <param name="keyword">关键词</param>
        /// <param name="module">模块</param>
        /// <returns>符合条件的权限列表</returns>
        List<PermissionDto> GetPermissionsByCondition(string keyword, string module);
        /// <summary>
        /// 创建新权限
        /// </summary>
        /// <param name="input">权限输入信息</param>
        void CreatePermission(CreatePermissionInput input);
        /// <summary>
        /// 更新权限信息
        /// </summary>
        /// <param name="input">权限输入信息</param>
        void UpdatePermission(UpdatePermissionInput input);
        /// <summary>
        /// 删除权限
        /// </summary>
        /// <param name="id">权限ID</param>
        void DeletePermission(long id);
        /// <summary>
        /// 检查权限名是否已存在
        /// </summary>
        /// <param name="permissionName">权限名</param>
        /// <returns>如果存在返回true，否则返回false</returns>
        bool CheckPermissionNameExists(string permissionName);

        // 用户角色关联
        /// <summary>
        /// 为用户分配角色
        /// </summary>
        /// <param name="userId">用户ID</param>
        /// <param name="roleId">角色ID</param>
        void AssignUserRole(AssignUserRoleInput input);
        /// <summary>
        /// 移除用户的角色
        /// </summary>
        /// <param name="userId">用户ID</param>
        /// <param name="roleId">角色ID</param>
        void RemoveUserRole(long userId, long roleId);
        /// <summary>
        /// 获取用户的角色列表
        /// </summary>
        /// <param name="userId">用户ID</param>
        /// <returns>用户角色列表</returns>
        List<RoleDto> GetUserRoles(long userId);

        // 角色权限关联
        /// <summary>
        /// 为角色分配权限
        /// </summary>
        /// <param name="roleId">角色ID</param>
        /// <param name="permissionId">权限ID</param>
        void AssignRolePermission(long roleId, long permissionId);
        /// <summary>
        /// 移除角色的权限
        /// </summary>
        /// <param name="roleId">角色ID</param>
        /// <param name="permissionId">权限ID</param>
        void RemoveRolePermission(long roleId, long permissionId);
        /// <summary>
        /// 获取角色的权限列表
        /// </summary>
        /// <param name="roleId">角色ID</param>
        /// <returns>角色权限列表</returns>
        List<PermissionDto> GetRolePermissions(long roleId);

        // 权限校验
        /// <summary>
        /// 获取用户的权限列表
        /// </summary>
        /// <param name="userId">用户ID</param>
        /// <returns>用户权限列表</returns>
        List<PermissionDto> GetUserPermissions(long userId);
        /// <summary>
        /// 检查用户是否具有某个权限
        /// </summary>
        /// <param name="userId">用户ID</param>
        /// <param name="permissionName">权限名</param>
        /// <returns>如果具有权限返回true，否则返回false</returns>
        bool CheckUserPermission(long userId, string permissionName);
        /// <summary>
        /// 获取用户的权限名称列表
        /// </summary>
        /// <param name="userId">用户ID</param>
        /// <returns>用户权限名称列表</returns>
        List<string> GetUserPermissionNames(long userId);



        /// <summary>
        /// 获取角色下的用户列表
        /// </summary>
        /// <param name="roleId">角色ID</param>
        /// <returns>该角色下的用户列表</returns>
        List<UserDto> GetRoleUsers(long roleId);


        /// <summary>
        /// 获取某权限下的所有角色
        /// </summary>
        /// <param name="permissionId">权限ID</param>
        /// <returns>拥有该权限的角色列表</returns>
        List<RoleDto> GetPermissionRoles(long permissionId);
        // <summary>
        /// 获取权限树结构
        /// </summary>
        /// <returns>权限树结构列表</returns>
        List<PermissionTreeNode> GetPermissionTree();
        /// <summary>
        /// 批量分配角色权限
        /// </summary>
        /// <param name="roleId">id</param>
        /// <param name="permissionIds">批量id</param>
        void AssignRolePermissionsBatch(long roleId, List<long> permissionIds);
        /// <summary>
        /// 批量移除角色权限
        /// </summary>
        /// <param name="roleId">id</param>
        /// <param name="permissionIds">批量id</param>
        void RemoveRolePermissionsBatch(long roleId, List<long> permissionIds);

        /// <summary>
        /// 批量分配用户角色
        /// </summary>
        /// <param name="userId">id</param>
        /// <param name="roleIds">批量id</param>
        void AssignUserRolesBatch(AssignUserRolesBatchInput input  );
        /// <summary>
        /// 批量删除用户角色
        /// </summary>
        /// <param name="userId">id</param>
        /// <param name="roleIds">批量id</param>
        void RemoveUserRolesBatch(long userId, List<long> roleIds);
        /// <summary>
        /// 获取角色树结构
        /// </summary>
        List<RoleTreeNode> GetRoleTree();

    }
}
